```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IPv4协议数据包格式详解</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background-color: #f8f9fa;
            color: #333;
            line-height: 1.6;
        }
        .hero {
            background: linear-gradient(135deg, #4a6bff 0%, #2a56d6 100%);
            color: white;
        }
        .card {
            transition: all 0.3s ease;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
            overflow: hidden;
        }
        .card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
        }
        .section-title {
            position: relative;
            padding-bottom: 10px;
        }
        .section-title:after {
            content: '';
            position: absolute;
            left: 0;
            bottom: 0;
            width: 60px;
            height: 3px;
            background: linear-gradient(90deg, #4a6bff, #2a56d6);
        }
        .header-icon {
            color: #4a6bff;
            margin-right: 10px;
        }
        .footer {
            background-color: #1a1a1a;
            color: #f1f1f1;
        }
        .footer a {
            transition: color 0.3s ease;
        }
        .footer a:hover {
            color: #4a6bff;
        }
        .mermaid {
            background: white;
            padding: 20px;
            border-radius: 10px;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        .highlight {
            background-color: #f0f7ff;
            border-left: 4px solid #4a6bff;
            padding: 15px;
            margin: 20px 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <section class="hero py-20 px-4 md:px-0">
        <div class="container mx-auto max-w-4xl text-center">
            <h1 class="text-4xl md:text-5xl font-bold mb-6">IPv4协议数据包格式解析</h1>
            <p class="text-xl md:text-2xl mb-8 opacity-90">探索网络通信的基础构建模块</p>
            <div class="flex justify-center">
                <div class="inline-flex items-center bg-white bg-opacity-20 px-6 py-3 rounded-full">
                    <i class="fas fa-network-wired mr-2"></i>
                    <span>网络协议核心技术</span>
                </div>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <main class="container mx-auto max-w-4xl px-4 py-12">
        <!-- Introduction -->
        <section class="mb-16">
            <div class="highlight">
                <p class="text-lg">IPv4协议是互联网协议套件中的核心协议之一，负责在互联网上路由和传输数据包。了解IPv4数据包的格式对于网络工程师、开发人员和任何对网络技术感兴趣的人都至关重要。</p>
            </div>
        </section>

        <!-- Visualization -->
        <section class="mb-16">
            <h2 class="text-2xl font-bold mb-6 section-title">
                <i class="fas fa-project-diagram header-icon"></i>IPv4数据包结构可视化
            </h2>
            <div class="mermaid">
                graph LR
                    A[IPv4数据包头] --> B[版本(4位)]
                    A --> C[首部长度(4位)]
                    A --> D[区分服务(8位)]
                    A --> E[总长度(16位)]
                    A --> F[标识(16位)]
                    A --> G[标志(3位)]
                    A --> H[片偏移(13位)]
                    A --> I[生存时间(8位)]
                    A --> J[协议(8位)]
                    A --> K[首部校验和(16位)]
                    A --> L[源地址(32位)]
                    A --> M[目标地址(32位)]
                    A --> N[选项(可变)]
                    A --> O[填充(可变)]
            </div>
        </section>

        <!-- Detailed Explanation -->
        <section>
            <h2 class="text-2xl font-bold mb-6 section-title">
                <i class="fas fa-info-circle header-icon"></i>字段详解
            </h2>
            
            <div class="grid md:grid-cols-2 gap-6">
                <!-- Column 1 -->
                <div>
                    <!-- Version -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">版本 (Version): 4位</h3>
                        <p>指示IP协议的版本号，对于IPv4，该字段的值为4。这个字段用来区分不同版本的IP协议，例如IPv4和IPv6。</p>
                        <div class="mt-3 text-sm text-gray-500">
                            <i class="fas fa-code mr-1"></i> 二进制值: 0100
                        </div>
                    </div>
                    
                    <!-- IHL -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">首部长度 (IHL): 4位</h3>
                        <p>表示IP数据包头部的长度，以32位(4字节)为单位。最小值是5(表示20字节的最小头部长度)，表示没有选项字段。如果有选项字段，这个值会更大。</p>
                    </div>
                    
                    <!-- DS -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">区分服务 (DS): 8位</h3>
                        <p>包括服务类型(Type of Service, ToS)和流量类别(Traffic Class)字段。它用于指定数据包的优先级和服务质量(QoS)。</p>
                        <div class="mt-3">
                            <span class="inline-block bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded mr-2">QoS</span>
                            <span class="inline-block bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">优先级</span>
                        </div>
                    </div>
                    
                    <!-- Total Length -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">总长度 (Total Length): 16位</h3>
                        <p>表示整个IP数据包的长度，包括头部和数据部分，单位为字节。这个字段的最大值是65535，表示IP数据包的最大长度为65535字节。</p>
                    </div>
                    
                    <!-- Identification -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">标识 (Identification): 16位</h3>
                        <p>唯一标识发送端在一定时间内发送的每个数据包。用于数据包的分片和重组，确保当一个数据包被分片时，所有的片段可以正确地被识别和重组。</p>
                    </div>
                    
                    <!-- Flags -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">标志 (Flags): 3位</h3>
                        <p>该字段用于控制或识别分片。在分片情况下，这些标志位用于控制数据包的分片和重组：</p>
                        <ul class="list-disc pl-5 mt-2">
                            <li><strong>第一位</strong>: 保留位，通常为0</li>
                            <li><strong>第二位(DF)</strong>: 如果设置为1，表示数据包不允许被分片</li>
                            <li><strong>第三位(MF)</strong>: 如果设置为1，表示数据包后面还有更多的片段</li>
                        </ul>
                    </div>
                </div>
                
                <!-- Column 2 -->
                <div>
                    <!-- Fragment Offset -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">片偏移 (Fragment Offset): 13位</h3>
                        <p>指示每个分片在原始数据包中的相对位置。这个字段帮助接收端将分片正确地拼装回完整的数据包。</p>
                    </div>
                    
                    <!-- TTL -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">生存时间 (TTL): 8位</h3>
                        <p>表示数据包在网络中存活的最大跳数(即通过的路由器数)。每经过一个路由器，该字段的值就会减1。当值减到0时，数据包会被丢弃。TTL字段用于防止数据包在网络中无限循环。</p>
                    </div>
                    
                    <!-- Protocol -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">协议 (Protocol): 8位</h3>
                        <p>指示数据包承载的上层协议类型，例如，ICMP(1)，TCP(6)，UDP(17)。这个字段告诉接收端应该将数据包中的数据部分传递给哪个协议进行处理。</p>
                        <div class="mt-3 flex flex-wrap gap-2">
                            <span class="inline-block bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">ICMP:1</span>
                            <span class="inline-block bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">TCP:6</span>
                            <span class="inline-block bg-blue-100 text-blue-800 text-xs px-2 py-1 rounded">UDP:17</span>
                        </div>
                    </div>
                    
                    <!-- Header Checksum -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">首部校验和 (Header Checksum): 16位</h3>
                        <p>用于验证IP头部的完整性。发送方计算IP头部的校验和并填入该字段，接收方也会进行相同的计算以验证数据包头部在传输过程中是否被损坏。</p>
                    </div>
                    
                    <!-- Source Address -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">源地址 (Source Address): 32位</h3>
                        <p>表示数据包的发送端的IP地址。这个字段帮助接收方知道数据包来自哪个源。</p>
                        <div class="mt-3 text-sm text-gray-500">
                            <i class="fas fa-laptop-code mr-1"></i> 示例: 192.168.1.1
                        </div>
                    </div>
                    
                    <!-- Destination Address -->
                    <div class="card bg-white p-6 mb-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">目标地址 (Destination Address): 32位</h3>
                        <p>表示数据包的目的地的IP地址。这个字段帮助路由器和接收方知道数据包的目的地。</p>
                        <div class="mt-3 text-sm text-gray-500">
                            <i class="fas fa-server mr-1"></i> 示例: 203.0.113.5
                        </div>
                    </div>
                    
                    <!-- Options -->
                    <div class="card bg-white p-6">
                        <h3 class="text-xl font-bold mb-3 text-blue-600">选项 (Options): 可变长度</h3>
                        <p>可选字段，用于提供额外的控制信息。常用于调试、测试和其他网络管理功能。这个字段不是每个数据包都需要的，因此它的长度是可变的。</p>
                    </div>
                </div>
            </div>
        </section>

        <!-- Key Concepts -->
        <section class="mt-16">
            <h2 class="text-2xl font-bold mb-6 section-title">
                <i class="fas fa-lightbulb header-icon"></i>关键概念解析
            </h2>
            <div class="grid md:grid-cols-3 gap-6">
                <div class="card bg-white p-6">
                    <div class="text-blue-500 text-3xl mb-3">
                        <i class="fas fa-puzzle-piece"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-2">数据包分片</h3>
                    <p>当数据包大小超过MTU(最大传输单元)时，路由器会将其分成多个较小的片段。标识、标志和片偏移字段共同确保这些片段能够正确重组。</p>
                </div>
                <div class="card bg-white p-6">
                    <div class="text-blue-500 text-3xl mb-3">
                        <i class="fas fa-shield-alt"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-2">头部校验</h3>
                    <p>首部校验和字段用于检测IP头部在传输过程中是否发生错误。如果校验失败，数据包会被丢弃，防止错误数据被处理。</p>
                </div>
                <div class="card bg-white p-6">
                    <div class="text-blue-500 text-3xl mb-3">
                        <i class="fas fa-route"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-2">路由选择</h3>
                    <p>源地址和目标地址字段是路由器决定数据包转发路径的关键依据。TTL字段则确保数据包不会在网络中无限循环。</p>
                </div>
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="footer py-8 text-center">
        <div class="container mx-auto">
            <p class="mb-2">技术小馆</p>
            <p><a href="http://www.yuque.com/jtostring" class="hover:text-blue-400">http://www.yuque.com/jtostring</a></p>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
        
        // Add hover effect to mermaid diagram
        document.addEventListener('DOMContentLoaded', function() {
            const mermaidNodes = document.querySelectorAll('.mermaid .node');
            mermaidNodes.forEach(node => {
                node.style.transition = 'all 0.3s ease';
                node.addEventListener('mouseover', function() {
                    this.style.fill = '#f0f7ff';
                    this.style.stroke = '#4a6bff';
                });
                node.addEventListener('mouseout', function() {
                    this.style.fill = '';
                    this.style.stroke = '';
                });
            });
        });
    </script>
</body>
</html>
```